using Digitalmes.Application.Mes.Masters.Lines;
using Digitalmes.Application.Mes.Masters.Materials;

namespace Digitalmes.Application.Mes.Productions.WorkOrders;

/// <summary>
/// 工单 DTO 对象。
/// </summary>
public sealed class ProdWorkOrderDto : Dto
{
    /// <summary>
    /// 父工单 Id。
    /// </summary>
    public long ParentId { get; set; }

    /// <summary>
    /// 工单编号
    /// </summary>
    [NotNull]
    public string? Wo { get; set; }

    /// <summary>
    /// 产品 Id。
    /// </summary>
    public long ProductId { get; set; }

    /// <summary>
    /// 产品
    /// </summary>
    public MdMaterialDto? Product { get; set; }

    /// <summary>
    /// 选择生产的生产线 Id
    /// </summary>
    public long LineId { get; set; }

    /// <summary>
    /// 产线
    /// </summary>
    public MdLineDto? Line { get; set; }

    /// <summary>
    /// 工单类型（试制、量产、返工）
    /// </summary>
    [JsonConverter(typeof(JsonStringEnumConverter))]
    public WoTypeEnum WoType { get; set; }

    /// <summary>
    /// 计划生产数量
    /// </summary>
    public int PlanQty { get; set; }

    /// <summary>
    /// 计划开始日期
    /// </summary>
    public DateTime PlanStartDate { get; set; }

    /// <summary>
    /// 计划完成日期
    /// </summary>
    public DateTime PlanEndDate { get; set; }

    /// <summary>
    /// 优先级，数值越小优先级越高。
    /// </summary>
    public int Priority { get; set; }

    /// <summary>
    /// 实际开始日期
    /// </summary>
    public DateTime? ActualStartDate { get; set; }

    /// <summary>
    /// 实际完成日期
    /// </summary>
    public DateTime? ActualEndDate { get; set; }

    /// <summary>
    /// 已投产的数量，表示已投入生产的数量。
    /// </summary>
    /// <remarks>
    /// 上线数量 >= 实际生产数量 + 报废数量；
    /// 当上线数量等于计划数量时，根据实际情况进行工单切换。
    /// </remarks>
    public int StartedQty { get; set; }

    /// <summary>
    /// 良品数量，表示生产完成的最终合格品数量。
    /// </summary>
    /// <remarks>OK下线产品都归于此数量。</remarks>
    public int GoodQty { get; set; }

    /// <summary>
    /// 报废数量。
    /// </summary>
    public int ScrappedQty { get; set; }

    /// <summary>
    /// 是否为主工单。
    /// </summary>
    /// <remarks>最终生产的成品属于主工单，主工单数据会加入到产能统计中。</remarks>
    public bool IsMaster { get; set; }

    /// <summary>
    /// 工单来源（手动导入、ERP下发）
    /// </summary>
    public string? Source { get; set; }

    /// <summary>
    /// 产成品批次号
    /// </summary>
    public string? BatchNo { get; set; }

    /// <summary>
    /// 描述
    /// </summary>
    public string? Remark { get; set; }

    /// <summary>
    /// 工单状态
    /// </summary>
    [JsonConverter(typeof(JsonStringEnumConverter))]
    public WoStatusEnum Status { get; set; }

    public string? CreatedBy { get; set; }

    public DateTime CreatedTime { get; set; }

    public string? UpdatedBy { get; set; }

    public DateTime? UpdatedTime { get; set; }
}
